iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0

今天速速進入正題,相較於 List 與 Tuple,集合 Set 內每個儲存的元素都必須是獨一無二的,另外也因為 Set 沒有所謂的順序,自然也就不能使用索引值進行取出指定的元素或是進行切片。

如何創建與刪除一個 Set?

一如前面的 list 與 tuple,set 也可以使用類別 set() 或是大括號 {} 創建,不過若是選擇使用 set() 創建類別,記得裡面的放入的引數必須是個「可以迭代的物件」。

# 創建一個空集合
set1 = set()

# 創建一個集合裡面有 "h" "a" "p" "y" 這幾個元素
set2 = set("happy")
print(set2) # {'y', 'a', 'h', 'p'},因為 set 沒有排序性

# 使用大括號創建集合
set3 = {'banana', 'orange', 'mango', 'lemon'}
print(set3) # {'mango', 'banana', 'orange', 'lemon'}

要特別注意的事,如果使用 set4 = {},這樣並「不會」創建一個空集合,反而會創造出我們還沒有講到的另一種資料型態——字典 dictionary。

講到刪除,我們也可以使用前幾天都有提及的關鍵字 del 刪除指定的 set。

fruits = {'banana', 'orange', 'mango', 'lemon'}
del fruits

print(fruits)   # NameError: name 'fruits' is not defined

如何知道一個 set 的長度?

雖然說 set 沒有順序,但我們仍然可以使用 len() 方法得知其長度。

fruits = {'banana', 'orange', 'mango', 'lemon'}
print(len(fruits))  # 4

如何取得 set 裡面的元素?

稍早不是才說由於 set 集合沒有索引值,所以我們也無法透過索引值取得指定的元素,但這並不代表我們不能取得 set 裡面的元素。(怎麼好像在繞口令?)

精準來說,我們可以透過迴圈 for loop的方式取得 set 中的所有元素。(這邊也還沒有說到迴圈 for loop,所以先看過就好。)

fruits = {'banana', 'orange', 'mango', 'lemon'}

for fruit in fruits:
    print(fruit)      # 這邊會一個一個印出 fruits 裡所有的元素

如何確認 set 裡面有沒有指定的元素?

同樣地,我們也可以使用 in 運算子查找 set 裡面有沒有指定的元素,而查找的結果則會返回一個布林值。

fruits = {'banana', 'orange', 'mango', 'lemon'}

print("mango" in fruits)    # True
print("lime" in fruits)     # False

如何增加或是刪除 set 裡面的元素?

我們可以使用 add() 或是 update() 方法來新增元素至集合,不過這兩種方法有些差異,如果使用 add() 只能一次新增一個元素至 set,而 update() 雖然可以一次新增多個元素,但 update() 裡面的引數必須是一個串列 list,讓我們直接看原始碼。

  • 使用 add() 方法

    fruits = {'banana', 'orange', 'mango', 'lemon'}
    fruits.add("lime")
    
    print(fruits)   # {'lemon', 'lime', 'orange', 'banana', 'mango'}
    
  • 使用 update() 方法

    fruits = {'banana', 'orange', 'mango', 'lemon'}
    fruits.update(["grape", "apple"])
    
    print(fruits)   # {'lemon', 'grape', 'apple', 'orange', 'banana', 'mango'}
    

我們也可透過 remove()discard() 來移除集合裡面的指定元素,兩者的功用近乎相同,但仍有些微的差異。

使用 remove() 時要特別注意,如果集合裡面沒有將要刪除的指定元素,此時 Python 會引起(拋出)錯誤,也就是所謂的 raise error。

  • 使用 remove() 方法

    fruits = {'banana', 'orange', 'mango', 'lemon'}
    fruits.remove("banana")
    print(fruits)   # {'lemon', 'orange', 'mango'}
    
    fruits.remove("apple") # 因為 fruits 裡面沒有 apple,所以會引發錯誤,而原本的集合也不會有所改變。
    
  • 使用 discard() 方法

    fruits = {'banana', 'orange', 'mango', 'lemon'}
    fruits.discard("banana")
    print(fruits)   # {'lemon', 'orange', 'mango'}
    
    fruits.discard("apple") # 雖然 fruits 裡面沒有 apple,但也不會引發任何錯誤,什麼事情都不會發生與改變。
    

其實 Set 作為可以儲存多個元素的資料型態,不僅可以過濾掉重複的元素,也可以查找兩個集合的交集、差集等,藉此來比較兩個資料的內容。

後記

在複習過程中,有時候會納悶「為什麼有些 Python 的資料型態這麼少用到?」,像我自己學習到現在,使用集合 set 的次數寥寥可數,不過現在回憶起,或許有些情境是可以改使用 set 以增加程式效率,學習語言像是擴充自己的工具箱,但工具箱裡的工具擴衝後,我們多數時候還是會挑選自己習慣的工具做使用,只有透由刻意使用,才會內化成技巧的一部分。


上一篇
復健第八天:跟元祖雪餅沒有關係的元組 Tuples
下一篇
復健第十天:不可思議的字典 Dictionary
系列文
初學者的 30 天 Python 復健課程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言